// 给定一个数组 nums，编写一个函数将所有 0 移动到数组的末尾，同时保持非零元素的相对顺序。

// 说明:
// 必须在原数组上操作，不能拷贝额外的数组。
// 尽量减少操作次数。

// 暴露接口
const moveZeroes = function (nums: number[]) {
    let left: number = 0;
    let right: number = 0;
    while (right < nums.length) {
        if (nums[right] !== 0) {
            moveZeroes_swap(nums, left, right);
            left++;
        }
        right++;
    }
    return nums;
};
// 辅助交换函数
function moveZeroes_swap(nums: number[], index1: number, index2: number) {
    let temp: number = nums[index1];
    nums[index1] = nums[index2];
    nums[index2] = temp;
}


// 这道题目其实值得当作一道例题来学习，
// 这道题目使用破解算法可以轻松解决，但并不优雅，这里我们使用双指针法来挪动元素
// 双指针法在数组移除元素中，可以达到 O(n) 的时间复杂度
// 所以此时使用双指针法才展现出效率的优势：「通过两个指针在一个for循环下完成两个for循环的工作。」
// 其实核心思想比较好归纳：
// 1.以 right 指针为基准遍历整个数组
// 2.left 的左边都是正确排序的非 0 数。
// 3.right 但凡指向了一个非 0 数，我们就交换 left 和 right 指向的数，并让 left 指针左移。
// 这么做的原因是因为遍历的过程中 right 指针可能跳过0，需要保持相对顺序不变，所以每个非0元素都需要交换到左边
// 至于left指针它指向的元素其实我们并不担心的